package org.jeecg.modules.system.controller;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.authz.annotation.RequiresRoles;
import org.jeecg.common.api.vo.Result;
import org.jeecg.modules.message.service.ISysMessageTemplateService;
import org.jeecg.modules.system.service.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * 通用唯一校验（安全漏洞修复）
 *
 * @author tianyi.jianng
 * @date 2024-0930
 */
@Slf4j
@RestController
@RequestMapping("/sys/unique")
public class UniqueCheckController {

    @Autowired
    private ISysUserService sysUserService;

    @Autowired
    private ISysDictService sysDictService;

    @Autowired
    private ISysPermissionService sysPermissionService;

    @Autowired
    private ISysMessageTemplateService sysMessageTemplateService;

    @Autowired
    private ISysPositionService sysPositionService;

    @Autowired
    private ISysDepartRoleService departRoleService;

    /**
     * 用户名是否可用
     *
     * @param username 待检查的用户名
     * @param dataId   数据Id
     */
    @RequiresRoles({"admin"})
    @GetMapping("/username")
    public Result<?> checkUsername(@RequestParam String username, @RequestParam(required = false) String dataId) {
        if (StringUtils.isNotEmpty(username) && sysUserService.checkUsername(username, dataId)) {
            return Result.ok("数据可用！");
        }
        return Result.error("数据不可用！");
    }

    /**
     * 判断工号是否存在
     *
     * @param workNo 工号
     * @param dataId 数据Id
     */
    @RequiresRoles({"admin"})
    @GetMapping("/workNo")
    public Result<?> checkWorkNo(@RequestParam(name = "work_no") String workNo, @RequestParam(required = false) String dataId) {
        if (StringUtils.isNotEmpty(workNo) && sysUserService.checkWorkNo(workNo, dataId)) {
            return Result.ok("数据可用！");
        }
        return Result.error("数据不可用！");
    }

    /**
     * 判断电话号是否可用
     *
     * @param phone  电话号
     * @param dataId 数据Id
     */
    @RequiresRoles({"admin"})
    @GetMapping("/phone")
    public Result<?> checkPhone(@RequestParam String phone, @RequestParam(required = false) String dataId) {
        if (StringUtils.isNotEmpty(phone) && sysUserService.checkPhone(phone, dataId)) {
            return Result.ok("数据可用！");
        }
        return Result.error("数据不可用！");
    }

    /**
     * 检查字典编码是否可用
     *
     * @param dictCode 字典编码
     * @param dataId   数据Id
     */
    @RequiresRoles({"admin"})
    @GetMapping("/dictCode")
    public Result<?> checkDictCode(@RequestParam(name = "dict_code") String dictCode, @RequestParam(required = false) String dataId) {
        if (StringUtils.isNotEmpty(dictCode) && sysDictService.checkDictCode(dictCode, dataId)) {
            return Result.ok("数据可用！");
        }
        return Result.error("数据不可用！");
    }

    /**
     * 检查权限是否可用
     *
     * @param perms  权限值
     * @param dataId 数据Id
     */
    @RequiresRoles({"admin"})
    @GetMapping("/perms")
    public Result<?> checkPerms(@RequestParam String perms, @RequestParam(required = false) String dataId) {
        if (StringUtils.isNotEmpty(perms) && sysPermissionService.checkPerms(perms, dataId)) {
            return Result.ok("数据可用！");
        }
        return Result.error("数据不可用！");
    }

    /**
     * 检查短信模板码是否可用
     *
     * @param templateCode 短信模板代码
     * @param dataId       数据Id
     */
    @RequiresRoles({"admin"})
    @GetMapping("/templateCode")
    public Result<?> checkTemplateCheck(@RequestParam(name = "template_code") String templateCode, @RequestParam(required = false) String dataId) {
        if (StringUtils.isNotEmpty(templateCode) && sysMessageTemplateService.checkTemplateCheck(templateCode, dataId)) {
            return Result.ok("数据可用！");
        }
        return Result.error("数据不可用！");
    }

    /**
     * 判断职位码是否可用
     *
     * @param code   职位码
     * @param dataId 数据Id
     */
    @RequiresRoles({"admin"})
    @GetMapping("/positionCode")
    public Result<?> checkPosition(@RequestParam String code, @RequestParam(required = false) String dataId) {
        if (StringUtils.isNotEmpty(code) && sysPositionService.checkPosition(code, dataId)) {
            return Result.ok("数据可用！");
        }
        return Result.error("数据不可用！");
    }

    /**
     * 判断角色码是否可用
     *
     * @param roleCode 角色码
     * @param dataId   数据Id
     */
    @RequiresRoles({"admin"})
    @GetMapping("/roleCode")
    public Result<?> checkRoleCode(@RequestParam(name = "role_code") String roleCode, @RequestParam(required = false) String dataId) {
        if (StringUtils.isNotEmpty(roleCode) && departRoleService.checkRoleCode(roleCode, dataId)) {
            return Result.ok("数据可用！");
        }
        return Result.error("数据不可用！");
    }

}
